﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace AllInOne.HDI.CRT_591_M001
{
    /// <summary>
    /// 发卡类dll
    /// </summary>
    public class GrantCardSDK
    {
        /// <summary>
        /// 函数：CommOpen
        /// 名称：打开串口
        /// </summary>
        /// <param name="port">串口号</param>
        /// <returns>>=0为成功，其它失败</returns>
        [DllImport("CRT_571.dll")]
        public static extern UInt32 CommOpen(string port);

        /// <summary>
        /// 函数：CommOpenWithBaut
        /// 名称：按指定的波特率打开串口
        /// 备注：必须先调用此函数，获得指定串口的串口文件句柄，才可调用其他函数可以同时打开多个串口，获得多个串口文件句柄，但不能多次打开同一个串口。使用完毕后，必须调用CommClose()关闭串口
        /// </summary>
        /// <param name="port">串口号</param>
        /// <param name="Baudrate">波特率</param>
        /// <returns>>=0为成功，其它失败</returns>
        [DllImport("CRT_571.dll")]
        public static extern UInt32 CommOpenWithBaut(string port, UInt32 Baudrate);

        /// <summary>
        /// 函数：CommClose
        /// 名称：关闭串口
        /// 备注: 与CommOpen()或CommOpenWithBaut 函数配套使用，并且在使用串口完毕后必须调用此函数关闭串口。
        /// </summary>
        /// <param name="ComHandle">串口号</param>
        /// <returns></returns>
        [DllImport("CRT_571.dll")]
        public static extern int CommClose(UInt32 ComHandle);

        /// <summary>
        /// 函数：ExecuteCommand
        /// 名称：执行命令函数
        /// 注：若RxReplyType 值为0x50 时，则RxStCode0，RxStCode1，RxStCode2 为卡机状态码
        ///     若RxReplyType 值为0x4E 时，则RxStCode1，RxStCode2 为失败原因码，RxStCode0 值无意义
        /// </summary>
        /// <param name="ComHandle">串口句柄</param>
        /// <param name="TxAddr">卡机地址，取值范围0x00~0x0f</param>
        /// <param name="TxCmCode">命令代码</param>
        /// <param name="TxPmCode">参数代码</param>
        /// <param name="TxDataLen">命令附加的数据包长度</param>
        /// <param name="TxData">命令附加的数据包</param>
        /// <param name="RxReplyType">返回的应答类型 0x50 : 执行成功 0x4E : 执行失败 0x10 : 下位机取消通讯 (NAK ) 0x20 : 通讯错误 0x30 : 上位机取消命令 (DLE, EOT) </param>
        /// <param name="RxStCode0">返回_卡机状态码0</param>
        /// <param name="RxStCode1">返回_卡机状态码1</param>
        /// <param name="RxStCode2">返回_卡机状态码2</param>
        /// <param name="RxDataLen">返回_数据包长度</param>
        /// <param name="RxData">返回_数据包</param>
        /// <returns>=0 成功 <>0 失败</returns>
        //int APIENTRY ExecuteCommand(HANDLE ComHandle,BYTE TxAddr,BYTE TxCmCode,BYTE TxPmCode,int TxDataLen,BYTE TxData[],BYTE *RxReplyType,BYTE *RxStCode0,BYTE *RxStCode1,BYTE *RxStCode2,int *RxDataLen,BYTE RxData[]);
        [DllImport("CRT_571.dll")]
        public static extern int ExecuteCommand(UInt32 ComHandle, byte TxAddr, byte TxCmCode, byte TxPmCode, UInt16 TxDataLen, byte[] TxData, ref byte RxReplyType, ref byte RxStCode0, ref byte RxStCode1, ref byte RxStCode2, ref UInt16 RxDataLen, byte[] RxData);

    }
}